package collection.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

/**
 * 常见的终端环节
 * 终端环节是流式操作的最后一步，用于获取结果。
 */
public class StreamApiDemo2 {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i=0;i<3;i++){
            list.add((int)(Math.random()*100));
        }
        System.out.println(list);
        /*
            常见的终端环节:
            1:min
              min用于获取流中的最小值
            2:max
              max用于获取流中的最大值

            3:anyMatch
              判断流中是否有元素匹配lambda表达式要求的条件

            4:allMatch
              判断流中是否所有元素都匹配lambda表达式要求的条件

            5:noneMatch
              判断流中是否没有元素匹配lambda表达式要求的条件

            6:reduce
              积累操作
              用流中前两个元素进行操作，将结果再与第三个元素操作，再将
              结果与第四个元素操作...

            Optional有点类似于包装类，内部保存了一个值
            get方法可以获取其内部表示的值
         */
        //获取流中最小值
        Optional<Integer> value = list.stream().min((e1, e2)->e1-e2);
        System.out.println(value.get());
        //获取流中最大值
        value = list.stream().max((e1, e2)->e1-e2);
        System.out.println(value.get());

        //判断集合中是否有偶数?
        boolean anyMatch = list.stream().anyMatch(e->e%2==0);
        System.out.println("是否有偶数:"+anyMatch);

        //判断集合中是否所有元素都是偶数?
        boolean allMatch = list.stream().allMatch(e->e%2==0);
        System.out.println("是否所有元素都是偶数:"+allMatch);

        //判断集合中是否没有偶数?
        boolean noneMatch = list.stream().noneMatch(e->e%2==0);
        System.out.println("是否没有偶数:"+noneMatch);

        //对集合元素求和(将集合所有元素累加)
        /*
            (e1, e2)->e1+e2
            内部:
            第一次会将集合中第一个元素和第二个元素相加
            第二次会将前两个元素的和与第三个元素相加
            第三次会将前连个元素的和与第四个元素相加

            集合:[67, 30, 31 ,55]   lambda:(e1, e2)->e1+e2
            第一次:
            e1:67   e2:30  reduce:67+30=97
            第二次:
            e1:97   e2:31  reduce:97+31=128
            第三次:
            e1:128  e2:55  reduce:128+55=183
         */
        int number = list.stream().reduce((e1, e2)->e1+e2).get();
        System.out.println(number);
    }
}
